package com.summer.framework.core.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * Description: 密码管理工具
 * @auther Ice Yang
 * Date 2025/8/12 14:51
 */
public class PasswordUtil {

    // 使用强度因子12（推荐值）
    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(12);

    /**
     * 加密密码
     * @param rawPassword 原始密码
     * @return BCrypt哈希值
     */
    public String encodePassword(String rawPassword) {
        return passwordEncoder.encode(rawPassword);
    }

    /**
     * 验证密码
     * @param rawPassword 原始密码
     * @param encodedPassword 已加密的密码
     * @return 是否匹配
     */
    public boolean verifyPassword(String rawPassword, String encodedPassword) {
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 获取BCrypt哈希值的元信息
     * @param encodedPassword 已加密的密码
     * @return 元信息字符串
     */
    public String getHashInfo(String encodedPassword) {
        if (encodedPassword == null || encodedPassword.length() < 4) {
            return "无效的BCrypt哈希";
        }

        // 提取算法版本
        String algorithm = encodedPassword.substring(0, 1);
        String algorithmName = switch (algorithm) {
            case "$2a" -> "BCrypt (2a)";
            case "$2b" -> "BCrypt (2b)";
            case "$2y" -> "BCrypt (2y)";
            default -> "未知算法";
        };

        // 提取成本因子
        String costFactor = encodedPassword.substring(4, 6);

        // 提取盐值部分（22个字符）
        String salt = encodedPassword.substring(7, 29);

        return String.format("算法: %s | 成本因子: %s | 盐值: %s",
                algorithmName, costFactor, salt);
    }
}
